package datos;

import java.util.LinkedList;
import java.util.List;
import java.util.UUID;
import java.sql.*;

import logica.Objeto;
import logica.Queja;
import logica.Usuario;
import datos.interfaces.IObjetoDAO;
import datos.interfaces.IQuejaDAO;
import datos.interfaces.IUsuarioDAO;

public class JDBCQuejaDAO implements IQuejaDAO {

	public boolean insertarQueja(Queja queja) {
		boolean res = false;
		ConnectionManager conexMan = ConnectionManager.getInstance();
		Connection conexion = conexMan.checkOut();
		String sql = "INSERT INTO queja (OID, usuarioOID, objetoOID, quejaID, problema, solucion, estado, fecha) VALUES(?, ?, ?, ?, ?, ?, ?, ?)";
		String quejaid="";
		try {
			IUsuarioDAO uDAO=new JDBCUsuarioDAO();
			IObjetoDAO oDAO=new JDBCObjetoDAO();
			String usuarioOID=uDAO.obtenerUsuarioOID(queja.getUsuario().getUsuarioID(),conexion);
			String objetoOID=oDAO.obtenerObjetoOID(queja.getObjeto().getObjetoID(),conexion);
			PreparedStatement ps = conexion.prepareStatement(sql);
			quejaid = UUID.randomUUID().toString();

			ps.setString(1, quejaid);
			ps.setString(2, usuarioOID);
			ps.setString(3, objetoOID);
			ps.setString(4, queja.getQuejaID());
			ps.setString(5, queja.getProblema());
			ps.setString(6, queja.getSolucion());
			ps.setString(7, queja.getEstado());
			ps.setDate(8, queja.getFecha());

			ps.execute();
			ps.close();
			conexMan.checkIn(conexion);

			res = true;

		} catch (SQLException e) {
			e.printStackTrace();
		}

		return res;
	}

	@Override
	public void modificarEstadoQueja(String quejaID, String estado) {
		ConnectionManager conexMan= ConnectionManager.getInstance();
		Connection conexion = conexMan.checkOut();
		String sql= "UPDATE queja SET estado=? WHERE quejaID=?";
		try{
			PreparedStatement ps=conexion.prepareStatement(sql);
			
			ps.setString(1, estado);
			ps.setString(2, quejaID);
			
			
			ps.execute();
			ps.close();
			conexMan.checkIn(conexion);
		}catch (SQLException e){
			e.printStackTrace();
		}

	}

	@Override
	public void modificarSolucionQueja(String quejaID, String solucion) {
		ConnectionManager conexMan= ConnectionManager.getInstance();
		Connection conexion = conexMan.checkOut();
		String sql= "UPDATE queja SET solucion=? WHERE quejaID=?";
		try{
			PreparedStatement ps=conexion.prepareStatement(sql);
			
			ps.setString(1, solucion);
			ps.setString(2, quejaID);
			
			
			ps.execute();
			ps.close();
			conexMan.checkIn(conexion);
		}catch (SQLException e){
			e.printStackTrace();
		}

	}

	public List<Queja> obtenerQuejas(String estado) {
		List<Queja> listaQuejas = new LinkedList<Queja>();
		String sql = "SELECT * FROM queja WHERE estado = ? ";

		ConnectionManager conexMan = ConnectionManager.getInstance();
		Connection conexion = conexMan.checkOut();
		PreparedStatement ps;

		
		
		try {
			ps = conexion.prepareStatement(sql);
			ps.setString(1, estado);
			
			ResultSet resultados = ps.executeQuery();

			while (resultados.next()) {
				Queja q = new Queja();

				IUsuarioDAO iUsuario = new JDBCUsuarioDAO();
				Usuario user = iUsuario.obtenerUsuario(resultados.getString("usuarioOID"));
				q.setUsuario(user);

				IObjetoDAO iObjeto = new JDBCObjetoDAO();
				Objeto obj = iObjeto.obtenerObjeto(resultados.getString("objetoOID"), conexion);
				q.setObjeto(obj);

				q.setQuejaID(resultados.getString("quejaID"));
				q.setProblema(resultados.getString("problema"));
				q.setSolucion(resultados.getString("solucion"));
				q.setEstado(resultados.getString("estado"));
				q.setFecha(resultados.getDate("fecha"));

				listaQuejas.add(q);
			}

		} catch (SQLException e) {
			e.printStackTrace();
		}
		return listaQuejas;
	}

	@Override
	public Queja obtenerQueja(String quejaID) {
		String sql = "SELECT * FROM queja WHERE quejaID = ? ";

		ConnectionManager conexMan = ConnectionManager.getInstance();
		Connection conexion = conexMan.checkOut();
		PreparedStatement ps;

		Queja q = new Queja();
		
		try {
			ps = conexion.prepareStatement(sql);
			ps.setString(1, quejaID);
			
			ResultSet resultados = ps.executeQuery();

			if(resultados.next()){
			
				IUsuarioDAO iUsuario = new JDBCUsuarioDAO();
				Usuario user = iUsuario.obtenerUsuario(resultados.getString("usuarioOID"));
				q.setUsuario(user);
	
				IObjetoDAO iObjeto = new JDBCObjetoDAO();
				Objeto obj = iObjeto.obtenerObjeto(resultados.getString("objetoOID"), conexion);
				q.setObjeto(obj);
	
				q.setQuejaID(resultados.getString("quejaID"));
				q.setProblema(resultados.getString("problema"));
				q.setSolucion(resultados.getString("solucion"));
				q.setEstado(resultados.getString("estado"));
				q.setFecha(resultados.getDate("fecha"));
			} else {
				q=null;
			}
				
			

		} catch (SQLException e) {
			e.printStackTrace();
		}
		return q;
	}

	//Dado un usuario y un estado obtiene una lista de quejas
	@Override
	public List<Queja> obtenerQuejasUsuario(String usuarioID, String estado) {
		List<Queja> listaQuejas = new LinkedList<Queja>();
		String sql = "SELECT * FROM queja WHERE estado = ? AND usuarioOID = ?";

		ConnectionManager conexMan = ConnectionManager.getInstance();
		Connection conexion = conexMan.checkOut();
		PreparedStatement ps;

				
		try {
			ps = conexion.prepareStatement(sql);
			ps.setString(1, estado);
			IUsuarioDAO iUsuario = new JDBCUsuarioDAO();
			String usID = iUsuario.obtenerUsuarioOID(usuarioID, conexion);
			ps.setString(2, usID);
			
			ResultSet resultados = ps.executeQuery();

			while (resultados.next()) {
				Queja q = new Queja();

				iUsuario = new JDBCUsuarioDAO();
				Usuario user = iUsuario.obtenerUsuario(resultados.getString("usuarioOID"));
				q.setUsuario(user);

				IObjetoDAO iObjeto = new JDBCObjetoDAO();
				Objeto obj = iObjeto.obtenerObjeto(resultados.getString("objetoOID"), conexion);
				q.setObjeto(obj);

				q.setQuejaID(resultados.getString("quejaID"));
				q.setProblema(resultados.getString("problema"));
				q.setSolucion(resultados.getString("solucion"));
				q.setEstado(resultados.getString("estado"));
				q.setFecha(resultados.getDate("fecha"));

				listaQuejas.add(q);
			}

		} catch (SQLException e) {
			e.printStackTrace();
		}
		return listaQuejas;
	}

	

}
